From 26db0b7276af9eadec4ce422915fd26cc307949d Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 12 Jan 2011 20:35:04 +0100 Subject: [PATCH] Make GtkMenu(Shell) use GtkStyleContext The default CSS has also been modified to theme these sensibly --- gtk/gtkcssprovider.c | 34 +++++++++-------- gtk/gtkmenu.c | 91 +++++++++++++++++++++++++++++++++----------- gtk/gtkmenushell.c | 9 +++-- 3 files changed, 93 insertions(+), 41 deletions(-) diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 871caac8a1..20206ce490 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -3727,14 +3727,16 @@ gtk_css_provider_get_default (void) " background-color: shade (@bg_color, 1.05);\n" "}\n" "\n" - ".check, .radio,\n" + ".check, .radio {\n" + " border-style: solid;\n" + " border-width: 1;\n" + "}\n" + "\n" ".check:active, .radio:active,\n" ".check:hover, .radio:hover {\n" " background-color: @base_color;\n" " border-color: @fg_color;\n" " color: @text_color;\n" - " border-style: solid;\n" - " border-width: 1;\n" "}\n" "\n" ".check:selected, .radio:selected {\n" @@ -3744,11 +3746,8 @@ gtk_css_provider_get_default (void) "\n" ".menu.check, .menu.radio {\n" " color: @fg_color;\n" - "}\n" - "\n" - ".menu:hover {\n" - " background-color: @selected_bg_color;\n" " border-style: none;\n" + " border-width: 0;\n" "}\n" "\n" ".popup {\n" @@ -3783,18 +3782,13 @@ gtk_css_provider_get_default (void) "}\n" "\n" ".menu:hover,\n" - ".menubar:hover {\n" + ".menubar:hover,\n" + ".menu.check:hover,\n" + ".menu.radio:hover {\n" " background-color: @selected_bg_color;\n" " color: @selected_fg_color;\n" "}\n" "\n" - ".menu .check,\n" - ".menu .radio,\n" - ".menu .check:active,\n" - ".menu .radio:active {\n" - " border-style: none;\n" - "}\n" - "\n" "GtkSpinButton.button {\n" " border-width: 1;\n" "}\n" @@ -3886,6 +3880,16 @@ gtk_css_provider_get_default (void) " background-color: lighter (@bg_color);\n" " color: @fg_color;\n" "}\n" + "\n" + ".menu {\n" + " border-width: 1;\n" + " padding: 0;\n" + "}\n" + "\n" + ".menu * {\n" + " border-width: 0;\n" + " padding: 2;\n" + "}\n" "\n"; provider = gtk_css_provider_new (); diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index 812756880a..c8c6c64557 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -2334,17 +2334,18 @@ get_menu_border (GtkWidget *widget, { GtkStyleContext *context; GtkStateFlags state; - GtkBorder *border_width; + GtkBorder padding, border_width; context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); - gtk_style_context_get (context, state, - "border-width", &border_width, - NULL); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border_width); - *border = *border_width; - gtk_border_free (border_width); + border->left = border_width.left + padding.left; + border->right = border_width.right + padding.right; + border->top = border_width.top + padding.top; + border->bottom = border_width.bottom + padding.bottom; } static void @@ -2535,6 +2536,9 @@ calculate_line_heights (GtkMenu *menu, guint **ret_min_heights, guint **ret_nat_heights) { + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding; GtkMenuPrivate *priv; GtkMenuShell *menu_shell; GtkWidget *child, *widget; @@ -2561,8 +2565,12 @@ calculate_line_heights (GtkMenu *menu, "horizontal-padding", &horizontal_padding, NULL); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); + border_width = gtk_container_get_border_width (GTK_CONTAINER (menu)); - avail_width -= (border_width + horizontal_padding + gtk_widget_get_style (widget)->xthickness) * 2; + avail_width -= (border_width + horizontal_padding) * 2 + padding.left + padding.right; for (children = menu_shell->priv->children; children; children = children->next) { @@ -3127,6 +3135,9 @@ gtk_menu_get_preferred_height_for_width (GtkWidget *widget, gint *minimum_size, gint *natural_size) { + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding, border; GtkMenu *menu = GTK_MENU (widget); GtkMenuPrivate *priv = menu->priv; guint *min_heights, *nat_heights; @@ -3137,7 +3148,13 @@ gtk_menu_get_preferred_height_for_width (GtkWidget *widget, gtk_widget_style_get (widget, "vertical-padding", &vertical_padding, NULL); border_width = gtk_container_get_border_width (GTK_CONTAINER (menu)); - min_height = nat_height = (border_width + vertical_padding + gtk_widget_get_style (widget)->ythickness) * 2; + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border); + + min_height = nat_height = (border_width + vertical_padding) * 2 + + padding.left + padding.right + border.left + border.right; n_heights = calculate_line_heights (menu, for_size, &min_heights, &nat_heights); @@ -3810,6 +3827,9 @@ get_arrows_sensitive_area (GtkMenu *menu, guint vertical_padding; gint win_x, win_y; gint scroll_arrow_height; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding; window = gtk_widget_get_window (widget); width = gdk_window_get_width (window); @@ -3821,8 +3841,11 @@ get_arrows_sensitive_area (GtkMenu *menu, "arrow-placement", &arrow_placement, NULL); - border = gtk_container_get_border_width (GTK_CONTAINER (menu)) + - gtk_widget_get_style (widget)->ythickness + vertical_padding; + border = gtk_container_get_border_width (GTK_CONTAINER (menu)) + vertical_padding; + + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); gdk_window_get_position (window, &win_x, &win_y); @@ -3834,15 +3857,15 @@ get_arrows_sensitive_area (GtkMenu *menu, upper->x = win_x; upper->y = win_y; upper->width = width; - upper->height = scroll_arrow_height + border; + upper->height = scroll_arrow_height + border + padding.top; } if (lower) { lower->x = win_x; - lower->y = win_y + height - border - scroll_arrow_height; + lower->y = win_y + height - border - padding.bottom - scroll_arrow_height; lower->width = width; - lower->height = scroll_arrow_height + border; + lower->height = scroll_arrow_height + border + padding.bottom; } break; @@ -3852,7 +3875,7 @@ get_arrows_sensitive_area (GtkMenu *menu, upper->x = win_x; upper->y = win_y; upper->width = width / 2; - upper->height = scroll_arrow_height + border; + upper->height = scroll_arrow_height + border + padding.top; } if (lower) @@ -3860,7 +3883,7 @@ get_arrows_sensitive_area (GtkMenu *menu, lower->x = win_x + width / 2; lower->y = win_y; lower->width = width / 2; - lower->height = scroll_arrow_height + border; + lower->height = scroll_arrow_height + border + padding.bottom; } break; @@ -3870,7 +3893,7 @@ get_arrows_sensitive_area (GtkMenu *menu, upper->x = win_x; upper->y = win_y + height - border - scroll_arrow_height; upper->width = width / 2; - upper->height = scroll_arrow_height + border; + upper->height = scroll_arrow_height + border + padding.top; } if (lower) @@ -3878,7 +3901,7 @@ get_arrows_sensitive_area (GtkMenu *menu, lower->x = win_x + width / 2; lower->y = win_y + height - border - scroll_arrow_height; lower->width = width / 2; - lower->height = scroll_arrow_height + border; + lower->height = scroll_arrow_height + border + padding.bottom; } break; } @@ -4977,6 +5000,9 @@ gtk_menu_scroll_item_visible (GtkMenuShell *menu_shell, { guint vertical_padding; gboolean double_arrows; + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding; y = priv->scroll_offset; width = gdk_window_get_width (gtk_widget_get_window (widget)); @@ -4988,8 +5014,12 @@ gtk_menu_scroll_item_visible (GtkMenuShell *menu_shell, double_arrows = get_double_arrows (menu); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); + height -= 2 * gtk_container_get_border_width (GTK_CONTAINER (menu)) + - 2 * gtk_widget_get_style (widget)->ythickness + + padding.top + padding.bottom + 2 * vertical_padding; if (child_offset < y) { @@ -5366,12 +5396,20 @@ get_visible_size (GtkMenu *menu) GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (menu); GtkContainer *container = GTK_CONTAINER (menu); + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding; gint menu_height; gtk_widget_get_allocation (widget, &allocation); - menu_height = (allocation.height - - 2 * (gtk_container_get_border_width (container) - + gtk_widget_get_style (widget)->ythickness)); + + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); + + menu_height = (allocation.height - + (2 * gtk_container_get_border_width (container)) - + padding.top - padding.bottom); if (!priv->tearoff_active) { @@ -5437,12 +5475,21 @@ get_menu_height (GtkMenu *menu) GtkMenuPrivate *priv = menu->priv; GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (menu); + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder padding, border; gint height; gtk_widget_get_allocation (widget, &allocation); + context = gtk_widget_get_style_context (widget); + state = gtk_widget_get_state_flags (widget); + gtk_style_context_get_padding (context, state, &padding); + gtk_style_context_get_border (context, state, &border); + height = allocation.height; - height -= (gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->ythickness) * 2; + height -= (gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2) + + padding.top + padding.bottom + border.top + border.bottom; if (!priv->tearoff_active) { diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c index eef635d83b..1bbbc177be 100644 --- a/gtk/gtkmenushell.c +++ b/gtk/gtkmenushell.c @@ -504,6 +504,7 @@ gtk_menu_shell_realize (GtkWidget *widget) GdkWindow *window; GdkWindowAttr attributes; gint attributes_mask; + GtkStyleContext *context; gtk_widget_set_realized (widget, TRUE); @@ -531,8 +532,8 @@ gtk_menu_shell_realize (GtkWidget *widget) gtk_widget_set_window (widget, window); gdk_window_set_user_data (window, widget); - gtk_widget_style_attach (widget); - gtk_style_set_background (gtk_widget_get_style (widget), window, GTK_STATE_NORMAL); + context = gtk_widget_get_style_context (widget); + gtk_style_context_set_background (context, window); } void @@ -945,7 +946,7 @@ gtk_menu_shell_enter_notify (GtkWidget *widget, if (event->detail != GDK_NOTIFY_INFERIOR) { - if (gtk_widget_get_state (menu_item) != GTK_STATE_PRELIGHT) + if ((gtk_widget_get_state_flags (menu_item) & GTK_STATE_FLAG_PRELIGHT) == 0) gtk_menu_shell_select_item (menu_shell, menu_item); /* If any mouse button is down, and there is a submenu @@ -1015,7 +1016,7 @@ gtk_menu_shell_leave_notify (GtkWidget *widget, (menu_item->priv->submenu == NULL)) { if ((event->detail != GDK_NOTIFY_INFERIOR) && - (gtk_widget_get_state (GTK_WIDGET (menu_item)) != GTK_STATE_NORMAL)) + (gtk_widget_get_state_flags (GTK_WIDGET (menu_item)) & GTK_STATE_FLAG_PRELIGHT) != 0) { gtk_menu_shell_deselect (menu_shell); } -- 2.30.2